import u from "./background-utils";

console.log(u.abc);
var baseUrl = "http://localhost:12345/api/BookMarkManage";

// 推送浏览器通知
function _showPop(title, msg = "") {
  var options = {
    type: "basic",
    title: title,
    message: msg,
    iconUrl: "../icons/38.png",
  };
  chrome.notifications.create(options, (res) => {
    console.log("chrome.notifications.create callback");
    console.log(res);
  });
}

// function xrequest(url, data = "", method = "GET") {
//   return new Promise((resolve, reject) => {
//     let xhr = new XMLHttpRequest();
//     xhr.open(method, url, true);
//     xhr.responseType = "json";
//     xhr.setRequestHeader("Content-Type", "application/json");
//     xhr.onload = (res) => {
//       resolve(xhr.response);
//     };
//     xhr.onerror = (err) => {
//       reject("request err!");
//     };
//     xhr.send(data);
//   });
// }

async function submit() {
  try {
    const res = await getLocalBookmark();
    const url = `${baseUrl}/PushBookMark`;
    const data = JSON.stringify({ bookmark: JSON.stringify(res) });
    const reponse = await xrequest(url, data, "POST");
    if (reponse["code"] == 0) console.log(reponse["code"]);
  } catch (e) {}
}

async function pull() {
  function objToFlat(bookmark, out = "") {
    // 级联数据扁平化
    if (out == "") out = {};
    bookmark.forEach((e) => {
      out[e.id] = e;
      if (Object.hasOwnProperty.call(e, "children") && e.children.length > 0)
        objToFlat(e.children, out);
    });
    return out;
  }

  function syncBookmark(local, remote) {
    // 生成云端备份相对本地收藏夹的变更

    let modiedOpt = { delete: [], add: [], modify: [] };
    let remoteIds = Object.keys.call(remote);
    let localIds = Object.keys.call(local);

    // 1.需要删除的id,即存在于本地，而云端未包含的
    localIds.forEach((e) => {
      if (remoteIds.indexOf(e) == -1) modiedOpt["delete"].push(e);
    });
  }

  try {
    // 1.获取云端备份
    const url = `${baseUrl}/PullBookMark`;
    const response = await fetch(url);
    const resJson = await response.json();
    const remoteBookMarkStr = resJson["data"]["bookmark"];
    const remoteBookMark = JSON.parse(remoteBookMarkStr);
    console.log("remoteBookMark:", remoteBookMark);

    // 1.获取本机收藏夹
    let localBookMark = await getLocalBookmark();
    const localBookMarkStr = JSON.stringify(localBookMark);
    console.log("localBookMark:", localBookMark);

    // 2-1.两份收藏夹相同
    // if (remoteBookMarkStr == localBookMarkStr) return console.log('拉取云端备份，暂无更新')

    // 2-2.对比两份收藏夹，获取差异
    let flatRemoteBookMark = objToFlat(remoteBookMark);
    let flatLocalBookMark = objToFlat(localBookMark);

    console.log(objToFlat(remoteBookMark));

    _showPop("拉取完毕");
  } catch (e) {
    console.log(e);
    _showPop("拉取收藏夹失败", JSON.stringify(e));
  }
}

// SWAPI 接口
// 获取本地收藏夹版本
function getLocalBookmarkVer(_, back) {
  chrome.storage.local.get(["bookMarkVer"], (res) => {
    back(res);
  });
}

function setLocalBookmarkVer(_, back) {
  chrome.storage.local.set({ bookMarkVer: "abc" }, (res) => {
    back(res);
  });
}

// 获取本地收藏夹
function getLocalBookmark(_, back) {
  chrome.bookmarks.getTree((bm) => {
    // console.log(bm)
    back(bm);
  });
}

function getBaseUrl(_, back) {
  back(baseUrl);
}

function setBaseUrl(_, back) {
  baseUrl = _.baseUrl;
  back({});
}

var SWAPI = {
  getLocalBookmark,
  getLocalBookmarkVer,
  setLocalBookmarkVer,
  getBaseUrl,
  setBaseUrl,
};

// 主程序开始
console.log("service-worker start");
// _showPop('hellow', "I'm come in")

pull();

/*************************************************************
 监听 permissions 配置的插件注册完成
 在 onInstalled 监听器内部，扩展使用 storage API 设置一个值。这将允许多个扩展组件访问该值并进行更新。
 大部分 API，包括 storage api，必须被注册在 manifest 的 permissions 字段中给插件使用。
************************************************************/
chrome.runtime.onInstalled.addListener(() => {
  console.log("permissions onInstalled");
});

chrome.bookmarks.onCreated.addListener((a, b, c) => {
  _showPop("hehe", "1");
});

/*************************************************************
 service worker Api
 响应各扩展应用的请求
 data示例
 {
    action:"getLocalBookmark",
    params:"",
 }

 ************************************************************/
function serviceWorkerListener(data, sender, back) {
  console.log("SW=>Action received :", data.action, data.params);
  SWAPI[data.action](data.params, back);
  return true;
}
chrome.runtime.onMessage.addListener(serviceWorkerListener);

console.log("chrome.bookmarks.onCreated", chrome.bookmarks.onCreated);

// chrome.bookmarks.onCreated.dispatch((a, b, c) => {
//   console.log('dispatch:', a, b, c)
// })
// let res = chrome.bookmarks.onCreated.hasListener((a, b, c) => {
//   console.log('hasListener:', a, b, c)
// })
// console.log('after:', res)
// chrome.bookmarks.onCreated.hasListeners((a, b, c) => {
//   console.log('hasListeners:', a, b, c)
// })
// chrome.bookmarks.onCreated.removeListener((a, b, c) => {
//   console.log('removeListener:', a, b, c)
// })

// 添加图标点击事件监听
// chrome.action.onClicked.addListener(() => {
//   console.log('1、点击了流沙插件图标')
//   // 获取主题类型
//   chrome.storage.local.get(['theme'], (res) => {
//     console.log('2、缓存的theme', res)
//     let { theme } = res
//     // 修改初始值
//     theme = theme === 'light' ? 'dark' : 'light'
//     console.log('3、切换 theme 为：', theme)
//     // 设置图标
//     chrome.action.setIcon({
//       path: 'icons/popup_' + theme + '_32.png',
//     })
//     // 设置title
//     chrome.action.setTitle({
//       title: theme === 'light' ? '流沙：明亮模式' : '流沙：暗黑模式',
//     })
//     // 设置主题类型
//     setThemeType(theme)
//     // 通过 tabs 发送消息改变主题类型
//     changeThemeByTabs(theme)
//   })
// })

// console.log(chrome)

// 打开新窗口
// chrome.windows.create(
//   {
//     focused: true,
//     width: 600,
//     height: 480,
//     url: 'pages/pop.html',
//     type: 'popup',
//   },
//   (res) => {
//     console.log('create window:', res)
//   }
// )

// 打开新标签
// chrome.tabs.create({ url: 'http://www.baidu.com' })
// 监听 Message
// chrome.runtime.onMessage.addListener((request, sender, back) => {
//   console.log('Action received :', request.action)
//   switch (request.action) {
//     case ' ': {
//       var options = {
//         type: 'basic',
//         title: 'nameVal',
//         message: 'msgVal',
//         iconUrl: 'icons/popup_dark_32.png',
//       }

//       chrome.notifications.create(options, (res) => {
//         console.log(res)
//       })
//       break
//     }

//     default:
//       break
//   }
// })

// 设置主题类型
// function setThemeType(type) {
//   chrome.storage.local.set({ theme: type }, () => {
//     console.log('设置主题模式为：', type)
//   })
// }

// 通过 tabs 发送消息改变主题类型
// tabs api，必须被注册在 manifest 的 permissions 字段中给插件使用，这里不然获取不到 url。
// function changeThemeByTabs(themeType) {
//   chrome.tabs.query({}, (tabs) => {
//     console.log('获取 tabs', tabs)
//     for (var i = 0; i < tabs.length; i++) {
//       console.log(`tabs[${i}].url`, tabs[i].url)
//       try {
//         const location = new URL(tabs[i].url)
//         const host = location.host
//         console.log(host, host.includes('blog.csdn.net'))
//         if (host.includes('blog.csdn.net')) {
//           console.log(tabs[i].id, tabs[i], themeType)
//           // 向选项卡发送消息
//           chrome.tabs.sendMessage(
//             tabs[i].id,
//             {
//               theme: themeType,
//             },
//             (response) => {
//               // 将打印出"接收到主题切换";
//               console.log(response)
//             }
//           )
//         }
//       } catch (e) {
//         console.error('报错--->', e)
//       }
//     }
//   })
// }

